#include <stdio.h>
#include <stdlib.h>

// 动态数组结构体
typedef struct {
    int *data; // 指向动态数组的指针
    size_t size; // long unsigned int 当前数组元素个数
    size_t capacity;  // 当前数组容量
} DynamicArray;

// 初始化动态数组
void initDynamicArray(DynamicArray *array, size_t initialCapacity) {
    array->data = (int *)malloc(sizeof(int) * initialCapacity);
    array->size = 0; //初始化动态数组元素个数为0
    array->capacity = initialCapacity; // 初始化动态数组的容量
}

// 释放动态数组内存
void destoryDynamicArray(DynamicArray *array) {
    free(array->data);
    array->size = 0;
    array->capacity = 0;
}

// 调整动态数组内存大小
void resizeDynamicArray(DynamicArray *array, size_t newCapacity) {
    array->data = (int *)realloc(array->data, newCapacity * sizeof(int));
    array->capacity = newCapacity;
}

// 获取动态数组长度（元素个数）
size_t getLength(const DynamicArray *array) {
    return array->size;
}

// 在指定位置插入新元素
void insertAt(DynamicArray *array, size_t index, int element) {
    if(index > array->size) {
        printf("无法插入该位置\n");
        return;
    }
    if(array->size >= array->capacity) {
        size_t newCapicity = array->capacity * 2; // 如果容量不足，扩大容量
        resizeDynamicArray(array, newCapicity);
    }

    for(size_t i = array->size; i > index; i--) {
        array->data[i] = array->data[i-1];
    }

    array->data[index] = element;
    array->size++;

}

// 在数组末尾插入元素
void insertEnd(DynamicArray *array, int element) {
    insertAt(array, array->size, element);
}

// 删除指定位置的元素并返回被删除的元素
int removeAt(DynamicArray *array, size_t index) {
    if(index >= array->size) {
        return -1; 
    }

    int deletedElement = array->data[index];

    for(size_t i = index; i < array->size - 1; i++){
        array->data[i] = array->data[i+1];
    }

    array->size--;

    return deletedElement;

}

// 删除末尾的元素并返回删除的元素
int removeEnd(DynamicArray *array) {
    return removeAt(array, array->size - 1);
}

// 遍历所有的元素
void print(DynamicArray *array) {
    for(int i = 0; i < array->size; i++) {
        printf("%d ", array->data[i]);
    }
    printf("\n");
}

int main(){
    DynamicArray myArray; 

    initDynamicArray(&myArray, 2);
    printf("初始化动态数组，初始容量为2\n");

    insertEnd(&myArray, 1);
    insertEnd(&myArray, 2);

    printf("动态数组当前长度：%zu\n", getLength(&myArray));

    insertAt(&myArray, 1, 3);
    printf("在索引1处插入元素3\n");

    printf("动态数组当前长度：%zu\n", getLength(&myArray));
    
    printf("删除索引1的元素，该元素是%d\n", removeAt(&myArray, 1));

    destoryDynamicArray(&myArray);
    printf("动态数组内存释放完成\n");

    return 0;
}